package com.dwliu.javaabc.thread;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;

/**
 * 
 * @author weizhentianxia
 *说明:
 *一、线程池的创建
 *Executors类提供了一系列工厂方法用于创建线程池，返回的线程池都实现了Executor接口
 *线程池包括：
 *1.固定数目的
 *2.可缓存的（调用execute将重用以前,并自动删除60秒未被使用的线程）
 *3.单例线程
 *ExecutorService提供了submit()方法，传递一个Callable或者Runnable，并返回future。
 *如果后台没有完成Callable的计算，此时调用返回Future对象的get()方法，会阻塞直到计算完成。
 *二、
 */
public class ConcurrentImpl {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("-----程序开始运行------");
		
		Date date1 = new Date();
		int taskSize = 5;
		//创建线程池
		ExecutorService pool = Executors.newFixedThreadPool(taskSize);
		
		//创建多个有返回值的任务
		List<Future> list = new ArrayList<Future>();
		
		//提交call
		for(int i=0; i<taskSize; i++){
			Callable c = new MyCallable(i+"");
			//执行并获取Future对象
			Future f = pool.submit(c);
			list.add(f);
		}
		//关闭线程池
		pool.shutdown();
		System.out.println("中间位置");
		//获取所有并发任务的运行结果
		for (Future f: list){
		//从future对象上获取任务的返回值，并输出到控制台
			try{
				System.out.println(f.get().toString());
			}catch(Exception e){
				
			}
		}
		
		Date date2 = new Date();
		System.out.println("------程序运行结束------");
		System.out.println("运行时间："+(date2.getTime()-date1.getTime())+"毫秒");
		
	}

}
class MyCallable implements Callable<Object>{
	private String taskNum;
	
	public MyCallable(String taskNum){
		this.taskNum = taskNum;
	}
	
	public Object call() throws Exception {
		// TODO Auto-generated method stub
		System.out.println(taskNum+"任务启动");
		Date dateTmp1 = new Date();
		Thread.sleep(1000);
		Date dateTmp2 = new Date();
		long time = dateTmp2.getTime() - dateTmp1.getTime();
		System.out.println(taskNum+"任务结束");
		return taskNum+"任务返回运行结果，当前任务时间:"+time+"毫秒";
	}
}
class MyRunnable implements Runnable{

	public void run() {
		// TODO Auto-generated method stub
		
	}
	
}